"""
Diese Klasse repraesentiert den Spieler in Position und RenderBild.
Wichtig fuer das Verstaendnis: Die Position des Spielers ist eigentlich die "Center"-Position der Map. Der Spieler 
bleibt immer in der Mitte des Bildschirms, aber die Map wird nach jedem Schritt auf ein neues Tile zentriert.


@author: Max
"""

import os

from pytmx import load_pygame
import pygame

import Resources

class Player(object):

    def __init__(self, log):
        self.Log = log
        
        # Aufbaue der Surface
        self.surfPlayer = pygame.Surface((16, 16)).convert()
        self.surfPlayer.set_colorkey(Resources.Colors.BLACK)
        
        # Laden der Player-Tiles
        self.playerTMX = load_pygame(os.path.join("..", "Resources", "Levels", "player.tmx"), pixelalpha=True)
        
        
        self.strName = 0 
        self.dictPosition = { 
           "Unten" : 0,
           "Oben" : 1,
           "Links" : 2,
           "Rechts" : 3
        }
        
        self.iCurrentPosition = self.dictPosition["Unten"]
        self.imgPlayer = self.playerTMX.getTileImage(self.iCurrentPosition, 0, 0)  
        
        self.bFoot = False
   
    def render(self):
        self.surfPlayer.fill(Resources.Colors.BLACK)
        self.surfPlayer.blit(self.imgPlayer, (0, 0))
    
    def movePlayer(self, key, iTSLF, iAccel):
        """ 
        Diese Funktion sorgt fuer die Bewegung des Spielers.
        
        @param key: Je nach Taste werden Richtung und Ziel gewaehlt.
        @param iTSLF: Um faire Bewegung zu gewaehrleisten findet die Bewegung mit Hilfe der Zeit statt.
        @param iAccel: Die Bewegungsgeschwindigkeit wird von aussen geregelt.
        
        @return: dirVect, dest: Es werde Richtung und Ziel zurueckgegeben.
        """
        dirVect = (0, 0)
        dest = (0, 0)
        
        # Hier ist die Bewegung der Map
        if key == pygame.K_w:
            dirVect = (0, int(-iTSLF * iAccel))
            dest = (0, -16)
        elif key == pygame.K_s:
            dirVect = (0, int(iTSLF * iAccel))
            dest = (0, 16)
        elif key == pygame.K_a:
            dirVect = (int(-iTSLF * iAccel), 0)
            dest = (-16, 0)
        elif key == pygame.K_d:
            dirVect = (int(iTSLF * iAccel), 0)
            dest = (16, 0)
        
        return dirVect, dest
    
    def playerInCorrectPosition(self, key):
        """
        Diese Funktion ueberprueft ob der Spieler bereits in die richtige Richtung schaut, bevor er loslaeuft.
        Das sorgt dafuer, dass ein Spieler nicht direkt in eine andere Richtung laeuft, sondern erst
        in die gewuenschte Richtung ausgerichet wird.
        
        @param key: Die Taste regelt die gewuenschte Ausrichtung.
        
        @return boolean: Je nachdem, ob die Position stimmt oder nicht wird True/False zurueckgegeben.
        """
        if key == pygame.K_w:
            if self.iCurrentPosition == self.dictPosition["Oben"]:
                return True
        if key == pygame.K_a:
            if self.iCurrentPosition == self.dictPosition["Links"]:
                return True
        if key == pygame.K_s:
            if self.iCurrentPosition == self.dictPosition["Unten"]:
                return True
        if key == pygame.K_d:
            if self.iCurrentPosition == self.dictPosition["Rechts"]:
                return True
        return False
    
    def correctPosition(self, evt):
        """
        Diese Funktion richtet nach Ueberpruefung durch "playerInCorrectPosition" den Spieler richtig aus
        
        @param evt: Es wird ein KeyDown-Event erwartet.
        """
        if evt != None:
            if evt.key == pygame.K_w:
                self.iCurrentPosition = self.dictPosition["Oben"]
            if evt.key == pygame.K_a:
                self.iCurrentPosition = self.dictPosition["Links"]
            if evt.key == pygame.K_s:
                self.iCurrentPosition = self.dictPosition["Unten"]
            if evt.key == pygame.K_d:
                self.iCurrentPosition = self.dictPosition["Rechts"]
            
        self.setPlayerDirection(0)  
        
    def setPlayerDirection(self, direction):    
        """
        Diese Funktion aenedert die Darstellung der Position.
        
        @param direction: Richtung, in welche sich der Spieler drehen soll.
        """ 
        self.imgPlayer = self.playerTMX.getTileImage(self.iCurrentPosition, direction, 0)
